
list(APPEND _keyboard_layouts
    kbda1
    kbda2
    kbda3
    kbdal
    kbdarme
    kbdarmw
    kbdaze
    kbdazel
    kbdbe
    kbdbga
    kbdbgm
    kbdbgt
    kbdblr
    kbdbr
    kbdbur
    kbdcan
    kbdcr
    kbdcz
    kbdcz1
    kbdda
    kbddv
    kbdeo
    kbdes
    kbdest
    kbdfc
    kbdfi
    kbdfr
    kbdgeo
    kbdgerg
    kbdgneo
    kbdgr
    kbdgrist
    kbdhe
    kbdheb
    kbdhu
    kbdic
    kbdinasa
    kbdinben
    kbdindev
    kbdinguj
    kbdinmal
    kbdir
    kbdit
    kbdja
    kbdkaz
    kbdko
    kbdla
    kbdlt1
    kbdlv
    kbdmac
    kbdne
    kbdno
    kbdpl
    kbdpl1
    kbdpo
    kbdro
    kbdrost
    kbdru
    kbdru1
    kbdsg
    kbdsk
    kbdsk1
    kbdsw
    kbdtat
    kbdth0
    kbdth1
    kbdth2
    kbdth3
    kbdtuf
    kbdtuq
    kbduk
    kbdur
    kbdurs
    kbdus
    kbdusa
    kbdusl
    kbdusr
    kbdusx
    kbduzb
    kbdvntc
    kbdycc
    kbdycl)

foreach(_keyboard_layout ${_keyboard_layouts})
    spec2def(${_keyboard_layout}.dll ${_keyboard_layout}/${_keyboard_layout}.spec)

    add_library(${_keyboard_layout} MODULE
        ${_keyboard_layout}/${_keyboard_layout}.c
        ${_keyboard_layout}/${_keyboard_layout}.rc
        ${CMAKE_CURRENT_BINARY_DIR}/${_keyboard_layout}.def)

    target_include_directories(${_keyboard_layout} PRIVATE ${REACTOS_SOURCE_DIR}/ntoskrnl/include)
    set_entrypoint(${_keyboard_layout} 0)
    set_image_base(${_keyboard_layout} 0x5FFF0000)
    set_subsystem(${_keyboard_layout} native)

    if(MSVC)
        # Merge the .text and .rdata section into the .data section
        add_target_link_flags(${_keyboard_layout} "/ignore:4254 /SECTION:.data,ER /MERGE:.text=.data /MERGE:.rdata=.data /MERGE:.bss=.data /MERGE:.edata=.data")
    else()
        # Use a custom linker script
        add_target_link_flags(${_keyboard_layout} "-Wl,-T,${CMAKE_CURRENT_SOURCE_DIR}/kbdlayout.lds")

        # Avoid "universal character names are only valid in C++ and C99" error.
        set_property(TARGET ${_keyboard_layout} PROPERTY C_STANDARD 99)
    endif()

    # dynamic analysis switches
    if (STACK_PROTECTOR)
        target_link_libraries(${_keyboard_layout} gcc_ssp)
    endif()

    if(RUNTIME_CHECKS)
        target_link_libraries(${_keyboard_layout} runtmchk)
    endif()

    add_dependencies(${_keyboard_layout} psdk)
    add_cd_file(TARGET ${_keyboard_layout} DESTINATION reactos/system32 FOR all)
endforeach()
